﻿using HART.Connectors;
using HART.Messages;

using System;
using System.Collections.Generic;

namespace HART
{
    /// <summary>
    /// 创建并管理HART协议以与连接的从设备通信。
    /// </summary>
    public class HartProtocol
    {
        private readonly IConnector _connector;

        /// <summary>
        /// 接收到的消息。
        /// </summary>
        public Queue<Response> Messages = new Queue<Response>();

        /// <summary>
        /// 是否与从设备连接。
        /// </summary>
        public bool IsConnected => _connector.IsConnected;

        /// <summary>
        /// 收到从设备的新消息时通知。
        /// </summary>
        public event Action NewMessage;

        /// <summary>
        /// 初始化与从设备的HART协议连接。
        /// </summary>
        /// <param name="connector">设备间的数据交换接口。</param>
        public HartProtocol(IConnector connector)
        {
            _connector = connector;
            _connector.DataReceived += GetNewMessage;
        }

        /// <summary>
        /// 打开与从设备的连接。
        /// </summary>
        public void Connect() => _connector.Connect();

        /// <summary>
        /// 关闭与从设备的连接。
        /// </summary>
        public void Disconnect() => _connector.Disconnect();

        /// <summary>
        /// 发送请求。
        /// </summary>
        /// <param name="message">请求消息。</param>
        public void Request(Request message) => _connector.Request(message.Serialize());

        /// <summary>
        /// 获取新消息。
        /// </summary>
        private void GetNewMessage()
        {
            Messages.Enqueue(Response.Deserialize(_connector.Response()));
            NewMessage?.Invoke();
        }
    }
}
